package collect;

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.stream.IntStream;

/**
 * 遍历 Collection 集合
 * @author galen
 */
public class CollectionEach {
    public static void main(String[] args) {
        Collection<String> objs = new HashSet<String>();
        objs.add("JAVA");
        objs.add("PHP");
        objs.add("Python");
        objs.add("Go");

        // 1、调用forEach()方法遍历
        System.out.println("======调用forEach()方法遍历========");
        objs.forEach(obj -> System.out.println(obj));

        // 2、使用迭代器遍历
        System.out.println("======使用迭代器遍历=========");
        Iterator<String> it = objs.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }

        // 3、使用Lambda表达式遍历Iterator迭代器
        System.out.println("=====使用Lambda表达式遍历Iterator迭代器=====");
        Iterator<String> it2 = objs.iterator();
        it2.forEachRemaining(obj -> System.out.println(obj));

        // 4、使用foreach循环遍历Collection集
        System.out.println("=====使用foreach循环遍历Collection集====");
        for (Object obj : objs) {
            System.out.println(obj); 
        }

        // 5、Predicate操作Collection集合
        System.out.println("=====Predicate操作Collection集合====");
        // 使用Lambda表达式(目标类型是Predicate)过滤集合
        objs.removeIf(ele -> ((String) ele).length() < 4);
        System.out.println(objs);


        // Stream操作Collection集合
        System.out.println("=====Stream操作Collection集合====");
        IntStream is = IntStream.builder().add(20).add(13).add(-2).add(18).build();

        // 下面调用聚集方法的代码每次只能执行一行
        // System.out.println("is 所有元素的最大值：" + is.max().getAsInt());
        // System.out.println("is 所有元素的最小值：" + is.min().getAsInt());
        // System.out.println("is 所有元素的总和：" + is.sum());
        // System.out.println("is 所有元素的总数：" + is.count());
        // System.out.println("is 所有元素的平均值：" + is.average());
        // System.out.println("is所有元素的平方是否都大于20: " + is.allMatch(ele -> ele * ele > 20));
        // System.out.println("is是否包含任何元素的平方大于20 : " + is.anyMatch(ele -> ele * ele > 20));

        // 将is映射成一个新Stream,新Stream的每个元素是原Stream元素的2倍+1
        IntStream newIs = is.map(ele -> ele * 2 + 1);

        // 使用方法引用的方式来遍历集合元素
        newIs.forEach(System.out::println);

    }
}
